<?php
declare(strict_types=1);

namespace app\model;


use Carbon\Carbon;
use think\db\Query;

/**
 * Class MobileOrder
 *
 * @property int $id 自增ID
 * @property int $agent_id 代理商id
 * @property int $channel_id 渠道id
 * @property int $user_id 用户ID
 * @property int $order_id 总订单号
 * @property string $sub_order_id 子订单号
 * @property string $out_order_id 用户订单号【api接口下单有次字段】
 * @property string $mobile 手机号码
 * @property int $amount 充值金额。单位：分
 * @property int $status 状态：1未支付 2已支付 3已取消 4支付失败
 * @property float $sale_discount 销售折扣
 * @property int $sale_price 售价。单位：分
 * @property float $settle_discount 结算折扣
 * @property int $settle_price 结算价。单位：分
 * @property float $supplier_discount 供应商折扣
 * @property int $supplier_price 交付给供应商的价格
 * @property int $platform_profit 平台利润
 * @property string $remark 备注
 * @property string $supplier_order_no 供应商订单号
 * @property int $supplier_status 供应商订单状态：-1代理商余额不足 1订单未创建 2订单已创建 3充值成功 4充值失败
 * @property int $profit 佣金。单位：分
 * @property int $settle_type 结算方式：1返佣 2预付
 * @property int $settle_status 结算状态：1无需结算 2待结算 3已结算
 * @property string $created_at 创建时间
 * @property string $updated_at 更新时间
 * @property int $refund_status 退款状态：1无需退款 2待退款 3退款成功
 * @property int $mobile_supplier_id 供应商id【mobile_supplier 表的id】
 * @property int $order_type 充值类型：1慢充 2快充
 * @property int $order_from 订单来源：1H5 2API 3代理商批量导入
 * @property string $notify_url 订单通知回调地址
 * @property bool|string $finish_time 充值到账时间
 * @property int $supplier_order_create_time 供应商订单创建时间
 * @property int $change_flag 失败是否自动切换：1切换 0不切换
 * @property string $official_sn 官方流水号
 * @property int $cancel_flag 撤销状态：0未撤销 1已撤销 2撤销失败
 * @property int $salesman_id 业务员id
 * @property int $salesman_stat_time 汇总时间 0:无须汇总 1:待汇总 >1 汇总时间
 * @property-read \app\model\Agent $agent
 * @property-read \app\model\AgentChannel $agentChannel
 * @property-read \app\model\MobileUser $user
 * @property-read mixed|string $isp_type_text
 * @property-read string $order_type_text
 * @property-read mixed|string $supplier_status_text
 * @property-read string $spend
 * @property string $ext_data 扩展信息
 * @property-read \app\model\AgentChannel $agent_channel
 * @property-read mixed $openid
 * @property-read mixed $final_status
 */
class MobileOrder extends CommonModel
{
    // 表名
    protected $table = 'mobile_order';

    // $status 状态：1未支付 2已支付 3已取消 4支付失败
    const C_STATUS_NO = 1;  // 未支付
    const C_STATUS_HAVE = 2;  // 已支付
    const C_STATUS_CANCEL = 3;  // 已取消
    const C_STATUS_FAIL = 4;  // 支付失败


    const SETTLE_STATUS_NO = 1;//無需結算
    const SETTLE_STATUS_WAIT = 2;//待結算
    const SETTLE_STATUS_FINISH = 3;//已结算

    // supplier_status 供应商订单状态：-1代理商余额不足 1订单未创建 2订单已创建 3充值成功 4充值失败
    const C_SUPPLIER_STATUS_NO_BALANCE = -1;
    const C_SUPPLIER_STATUS_NO_CREATE = 1;
    const C_SUPPLIER_STATUS_CREATE = 2;
    const C_SUPPLIER_STATUS_SUCCESS = 3;
    const C_SUPPLIER_STATUS_FAIL = 4;
    const C_SUPPLIER_STATUS_OTHER = 99;

    // 供应商状态
    public static $supplierStatusMap = [
        self::C_SUPPLIER_STATUS_NO_BALANCE => '代理商余额不足',
        self::C_SUPPLIER_STATUS_NO_CREATE => '订单未创建',
        self::C_SUPPLIER_STATUS_CREATE => '订单已创建',
        self::C_SUPPLIER_STATUS_SUCCESS => '充值成功',
        self::C_SUPPLIER_STATUS_FAIL => '充值失败',
        self::C_SUPPLIER_STATUS_OTHER => '充值失败',
    ];

    // 供应商充值失败
    public static $supplierStatusFailArr = [
        self::C_SUPPLIER_STATUS_FAIL,
        self::C_SUPPLIER_STATUS_OTHER
    ];

    //开放平台整理给客户的状态
    const FINAL_STATUS_NO_PAY = 1;//未支付 或支付失败
    const FINAL_STATUS_PAY = 2;//已支付正在处理
    const FINAL_STATUS_SUCCESS = 3;//充值成功
    const FINAL_STATUS_FAIL = 4;//充值失败

    /**
     * 关联代理商
     * @return \think\model\relation\HasOne
     */
    public function agent()
    {
        return $this->hasOne(Agent::class, 'id', 'agent_id');
    }


    /**
     * 用户
     */
    public function user()
    {

        return $this->hasOne(MobileUser::class, 'id', 'user_id');

    }

    public function agentChannel(){

        return $this->hasOne(AgentChannel::class,'id','channel_id');

    }


    /**
     * 运营商类型 文本格式
     * @param $value
     * @param $model
     * @return mixed|string
     */
    public function getIspTypeTextAttr($value, $model)
    {
        $ispType = getMobileIsp($model['mobile']);
        $arr = [-1 => '未知', 1 => '移动', 2 => '联通', 3 => '电信'];
        return $arr[$ispType] ?? '';
    }

    /**
     * 充值类型 文本
     * @param $value
     * @param $model
     * @return string
     */
    public function getOrderTypeTextAttr($value, $model)
    {
        return $model['order_type'] == SLOW_RECHARGE ? '慢充' : '快充';
    }

    /**
     * 充值状态 文本
     * @param $value
     * @return mixed|string
     */
    public function getSupplierStatusTextAttr($value, $model)
    {
        $statusMap = [
            self::C_SUPPLIER_STATUS_SUCCESS => '充值成功',
            self::C_SUPPLIER_STATUS_FAIL => '充值失败',
        ];
        return $statusMap[$model['supplier_status']] ?? '正在充值';
    }

    /**
     * 耗时
     * @param $value
     * @param $model
     * @return string
     */
    public function getSpendAttr($value, $model)
    {
        $text = '';
        if ($model['finish_time']) {
            $text = getRemainderTime(strtotime($model['created_at']), $model['finish_time']);
        }
        return $text;
    }

    /**
     * 完成时间 Y-m-d H:i:s
     * @param $value
     * @return false|string
     */
    public function getFinishTimeAttr($value)
    {
        return $value ? date('Y-m-d H:i:s', $value) : '';
    }


    /**
     * 搜索开始时间
     * @param $query
     * @param $value
     * @param $params
     */
    public function searchStartAtAttr($query, $value, $params)
    {


        $start_at = $params['start_at'] ?? '';

        if (empty($start_at)) return;

        //日
        /** @var Query $query */

        $query->where('created_at', '>=', $start_at);

    }


    /**
     * 搜索开始时间
     * @param $query
     * @param $value
     * @param $params
     */
    public function searchEndAtAttr($query, $value, $params)
    {
        $end_at = $params['end_at'] ?? '';

        if (empty($end_at)) return;

        /** @var Query $query */

        $query->where('created_at', '<=', $end_at);
    }


    /**
     * @param string $name
     */
    public function getOpenidAttr($value, $model)
    {

        return !empty($this->user) ? $this->user->openid : 0;
    }


    /**
     * 最终状态
     * @param $value
     * @param $model
     */
    public function getFinalStatusAttr($value, $model)
    {
        if ($this->status != self::C_STATUS_HAVE){
            return self::FINAL_STATUS_NO_PAY;
        }

        if ($this->supplier_status == self::C_SUPPLIER_STATUS_SUCCESS){
            return self::FINAL_STATUS_SUCCESS;
        }

        if ($this->supplier_status == self::C_SUPPLIER_STATUS_FAIL){
            return self::FINAL_STATUS_FAIL;
        }

        return self::FINAL_STATUS_PAY;


    }

}